/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package com.evangelion.core.daoImpl;

import com.evangelion.core.bean.Movimiento;
import com.evangelion.core.bean.MovimientoAux;
import com.evangelion.core.bean.Seccione;
import com.evangelion.core.dao.MovimientoDao;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import javax.persistence.Query;

import org.apache.commons.lang3.StringUtils;
import org.springframework.stereotype.Component;
import org.springframework.transaction.annotation.Transactional;

/**
 *
 * @author Kellycasma
 */
@Component
@Transactional
public class MovimientoDaoImpl extends AbstractDAO implements MovimientoDao {

    @Override
    public List<Movimiento> searchByApunte(Seccione seccion, String valorParametro, Date fechaI, Date fechaF) {

        String sql = "SELECT m FROM Movimiento m WHERE 1=1 ";
        Map<String, Object> pMap = new HashMap<String, Object>();

        if (StringUtils.isNotEmpty(valorParametro)) {
            sql += "and m.id = :valorParametro ";
            int valor = Integer.parseInt(valorParametro);
            pMap.put("valorParametro", valor);
        }

        if (null != fechaI) {
            sql += "AND m.fecha>= :fechaI ";
            pMap.put("fechaI", fechaI);
        }

        if (null != fechaF) {
            sql += " AND  m.fecha<=:fechaF ";
            pMap.put("fechaF", fechaF);
        }

        Query query = em.createQuery(sql);
        for (String key : pMap.keySet()) {
            query.setParameter(key, pMap.get(key));
        }

        return query.getResultList();
    }

    @Override
    public List<Movimiento> searchByFactura(Seccione seccion, Date fechaIn, Date fechaFn) {
        Query q = em.createQuery("SELECT  m FROM Movimiento m WHERE m.fecha>= :fechaIn AND m.fecha<=:fechaFn AND m.excluir <> 1 AND m.seccion=:seccion");

        q.setParameter("fechaIn", fechaIn);
        q.setParameter("fechaFn", fechaFn);
        q.setParameter("seccion", seccion);
        return q.getResultList();
    }

    public Double searchByTotal(Seccione seccion, Date fechaIn, Date fechaFn) {
        Query q = em.createQuery("SELECT SUM(m.haber) FROM Movimiento m WHERE m.fecha>= :fechaIn AND m.fecha<=:fechaFn AND m.excluir <> 1 AND m.seccion=:seccion");

        q.setParameter("fechaIn", fechaIn);
        q.setParameter("fechaFn", fechaFn);
        q.setParameter("seccion", seccion);
        return (Double) q.getSingleResult();
    }

    public Double searchByImpIva(Seccione seccion, Date fechaIn, Date fechaFn) {
        Query q = em.createQuery("SELECT SUM(m.impIVA) FROM Movimiento m WHERE m.fecha>= :fechaIn AND m.fecha<=:fechaFn AND m.excluir <> 1 AND m.seccion=:seccion");

        q.setParameter("fechaIn", fechaIn);
        q.setParameter("fechaFn", fechaFn);
        q.setParameter("seccion", seccion);
        return (Double) q.getSingleResult();
    }

    @Override
    public List<MovimientoAux> searchByHecho(Seccione seccion, Date fechaI, Date fechaF) {
        Query q;
        if (seccion == null) {
            q = em.createQuery("SELECT d FROM MovimientoAux d WHERE d.fecha>= :fechaI AND d.fecha<=:fechaF AND d.declaracion.tipo <> 'Facturacion' ");

        } else {
            q = em.createQuery("SELECT d FROM MovimientoAux d WHERE d.fecha>= :fechaI AND d.fecha<=:fechaF AND d.declaracion.tipo <> 'Facturacion' AND d.seccion=:seccion");
            q.setParameter("seccion", seccion);
        }

        q.setParameter("fechaI", fechaI);
        q.setParameter("fechaF", fechaF);
        return q.getResultList();
    }

    @Override
    public List<Movimiento> findListFacturasIngreso(Seccione seccion, Date fechaI, Date fechaF) {
        Query q = em.createQuery("SELECT m FROM Movimiento m WHERE m.fecha>= :fechaI AND m.fecha<=:fechaF and m.haber IS NOT NULL ");

        q.setParameter("fechaI", fechaI);
        q.setParameter("fechaF", fechaF);
        return (List) q.getResultList();
    }

    @Override
    public Double findSumaFacturasIngreso(Seccione seccion, Date fechaI, Date fechaF) {
        Query q = em.createQuery("SELECT SUM(m.total) FROM Movimiento m WHERE m.fecha>= :fechaI AND m.fecha<=:fechaF AND m.haber IS NOT NULL");

        q.setParameter("fechaI", fechaI);
        q.setParameter("fechaF", fechaF);
        return (Double) q.getSingleResult();
    }

    @Override
    public Double findSumaFacturasAdeclarar(Seccione seccion, Date fechaI, Date fechaF) {
        Query q = em.createQuery("SELECT SUM(m.total) FROM Movimiento m WHERE m.fecha>= :fechaI AND m.fecha<=:fechaF AND m.haber IS NOT NULL AND m.concepto LIKE '%PRACTIC%'");

        q.setParameter("fechaI", fechaI);
        q.setParameter("fechaF", fechaF);
        return (Double) q.getSingleResult();
    }

    @Override
    public int getMaxDocumentoTablaMovimientos() {
        String sql = "SELECT m.documento from Movimiento m order by m.id desc";
        Query q = em.createQuery(sql);
        q.setMaxResults(1);
        String documento = "";
        try {
            documento += q.getSingleResult();
        } catch (Exception e) {
            documento = null;
        }
        if (documento != null) {
            try {
                return Integer.parseInt(documento);
            } catch (Exception e) {
                return 0;
            }
        }
        return 0;
    }

    @Override
    public void save(Movimiento movimiento) {
        super.save(movimiento);
    }

    @Override
    public void save(MovimientoAux movimientoaux) {
        super.save(movimientoaux);
    }
}
